package com.xcc.annotation.aop.log;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * 定义切面类
 *
 * @Aspect 通过这个注解去识别为切面类
 */
@Aspect
public class LogAspects {

    /**
     * 抽取公用的切面表达式
     * 1,本类引用直接使用当前方法名就行
     * 2,其他切面引用则需要加上全类名和方法
     */
    @Pointcut("execution(public int com.xcc.annotation.aop.log.MathCalculator.*(..))")
    public void pointCut() {
    }

    /**
     * 前置处理器
     */
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName()
                + "运行。。。@Before:参数列表是：{" + Arrays.toString(joinPoint.getArgs()) + "}");
    }

    /**
     * 后置处理器
     */
    @After("com.xcc.annotation.aop.log.LogAspects.pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName()
                + "运行。。。@After ..." );
    }

    /**
     * 返回通知
     *  JoinPoint一定要出现在参数表的第一位
     */
    @AfterReturning(value = "pointCut()",returning = "result")
    public void logReturn(JoinPoint joinPoint,Object result) {
        System.out.println(joinPoint.getSignature().getName()
                + "运行。。。@AfterReturning:返回值为：{" + result + "}");
    }

    @AfterThrowing(value = "pointCut()",throwing = "e")
    public void logException(JoinPoint joinPoint,Exception e) {
        System.out.println(joinPoint.getSignature().getName()
                +"异常。。。异常信息：{"+e+"}");
    }

}
